home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-05-21 | 1.8 KB | 84 lines | [TEXT/ttxt] |
- --<<
-
- in module InternetFish
-
- class MessageQueue ()
- instance variables
- myQueue
- myStream
- myFunction
- myWriter
- myReader
- myClient
- end
-
-
- method init self {object MessageQueue} #rest args #key stream: fun: client: -> (
- self.myQueue := new PipeClass
- self.myStream := stream
- self.myFunction := fun
- self.myClient := client
- self.myWriter := ((doWriting self) &)
- self.myReader := ((doReading self) &)
- )
-
- method write self {object MessageQueue} obj -> (
- write self.myQueue obj
- )
-
- method writePacket self {object MessageQueue} o -> (
- local n := size o
- if (n < 256 and n > 0) then (
- write self.myStream n
- ) else (
- write self.myStream 0
- write self.myStream (mod n 256)
- write self.myStream ((n / 256) as integer)
- )
- for i in o do write self.myStream i
- )
-
- method doWriting self {object MessageQueue} -> (
- guard (
- repeat while true do (
- writePacket self (read self.myQueue)
- repeat while self.myQueue.size > 0 do
- writePacket self (read self.myQueue)
- flush self.myStream
- )
- )
- catching
- cantWrite : ( caught (self.myFunction self.myCLient #(@writeFailed, self.myStream))
- )
- TCPException: ( caught (self.myFunction self.myCLient #(@writeFailed, self.myStream)))
- end
- )
-
- method doReading self {object MessageQueue} -> (
- guard (
- repeat while true do (
- local n := (read self.myStream)
- if (n == 0) do (
- n := (read self.myStream)
- n := n + 256 * (read self.myStream)
- )
- local s := new array
- for i in 1 to n do append s (read self.myStream)
- self.myFunction self.myCLient s
- )
- )
- catching
- cantRead : ( caught (self.myFunction self.myCLient #(@readFailed, self.myStream))
- )
- TCPException: ( caught (self.myFunction self.myCLient #(@readFailed, self.myStream))
- )
- end
- )
-
- method plug self {object MessageQueue} -> (
- -- What can we do here?
- )
-
- -->>
-
-